Prozkoumejte Next.js API Routes a odemkněte možnosti full-stack vývoje ve vašich React aplikacích. Naučte se vzory, osvědčené postupy a strategie nasazení.
Next.js API Routes: Vzory pro full-stack vývoj
Next.js přinesl revoluci do vývoje v Reactu tím, že poskytl robustní framework pro tvorbu výkonných a škálovatelných webových aplikací. Jednou z jeho klíčových funkcí jsou API Routes, které umožňují vývojářům vytvářet backendovou funkcionalitu přímo v rámci jejich Next.js projektů. Tento přístup zjednodušuje vývoj, usnadňuje nasazení a odemyká výkonné full-stack schopnosti.
Co jsou Next.js API Routes?
Next.js API Routes jsou serverless funkce napsané přímo ve vašem adresáři /pages/api
. Každý soubor v tomto adresáři se stává API endpointem, který automaticky směruje HTTP požadavky na svou odpovídající funkci. To eliminuje potřebu samostatného backendového serveru, zjednodušuje architekturu vaší aplikace a snižuje provozní náklady.
Představte si je jako miniaturní serverless funkce, které žijí uvnitř vaší Next.js aplikace. Reagují na HTTP požadavky jako GET, POST, PUT, DELETE a mohou interagovat s databázemi, externími API a dalšími serverovými zdroji. Klíčové je, že běží pouze na serveru, nikoli v prohlížeči uživatele, což zajišťuje bezpečnost citlivých dat, jako jsou API klíče.
Klíčové výhody API Routes
- Zjednodušený vývoj: Pište kód pro frontend i backend v rámci jednoho projektu.
- Serverless architektura: Využijte serverless funkce pro škálovatelnost a nákladovou efektivitu.
- Snadné nasazení: Nasaďte svůj frontend a backend společně jediným příkazem.
- Zlepšený výkon: Server-side rendering a možnosti načítání dat zvyšují rychlost aplikace.
- Zvýšená bezpečnost: Citlivá data zůstávají na serveru, chráněná před odhalením na straně klienta.
Začínáme s API Routes
Vytvoření API route v Next.js je jednoduché. Stačí vytvořit nový soubor v adresáři /pages/api
. Název souboru určí cestu k route. Například vytvoření souboru s názvem /pages/api/hello.js
vytvoří API endpoint dostupný na /api/hello
.
Příklad: Jednoduché API pro pozdrav
Zde je základní příklad API route, která vrací JSON odpověď:
// pages/api/hello.js
export default function handler(req, res) {
res.status(200).json({ message: 'Ahoj z Next.js API Route!' });
}
Tento kód definuje asynchronní funkci handler
, která přijímá dva argumenty:
req
: Instancehttp.IncomingMessage
, plus několik předpřipravených middlewarů.res
: Instancehttp.ServerResponse
, plus několik pomocných funkcí.
Funkce nastaví HTTP stavový kód na 200 (OK) a vrátí JSON odpověď se zprávou.
Zpracování různých HTTP metod
Různé HTTP metody (GET, POST, PUT, DELETE atd.) můžete v rámci vaší API route zpracovávat kontrolou vlastnosti req.method
. To vám umožní snadno vytvářet RESTful API.
// pages/api/todos.js
export default async function handler(req, res) {
if (req.method === 'GET') {
// Získání všech úkolů z databáze
const todos = await fetchTodos();
res.status(200).json(todos);
} else if (req.method === 'POST') {
// Vytvoření nového úkolu
const newTodo = await createTodo(req.body);
res.status(201).json(newTodo);
} else {
// Zpracování nepodporovaných metod
res.status(405).json({ message: 'Metoda není povolena' });
}
}
Tento příklad ukazuje, jak zpracovávat GET a POST požadavky pro hypotetický endpoint /api/todos
. Zahrnuje také zpracování chyb pro nepodporované metody.
Vzory pro full-stack vývoj s API Routes
Next.js API Routes umožňují různé vzory pro full-stack vývoj. Zde jsou některé běžné případy použití:
1. Získávání a manipulace s daty
API Routes lze použít k načítání dat z databází, externích API nebo jiných datových zdrojů. Mohou být také použity k manipulaci s daty, jako je vytváření, aktualizace nebo mazání záznamů.
Příklad: Získání uživatelských dat z databáze
// pages/api/users/[id].js
import { query } from '../../../lib/db';
export default async function handler(req, res) {
const { id } = req.query;
try {
const results = await query(
'SELECT * FROM users WHERE id = ?',
[id]
);
if (results.length === 0) {
return res.status(404).json({ message: 'Uživatel nenalezen' });
}
res.status(200).json(results[0]);
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Interní chyba serveru' });
}
}
Tento příklad načítá uživatelská data z databáze na základě ID uživatele poskytnutého v URL. Používá knihovnu pro databázové dotazy (předpokládá se, že je v lib/db
) k interakci s databází. Všimněte si použití parametrizovaných dotazů k prevenci SQL injection zranitelností.
2. Autentizace a autorizace
API Routes lze použít k implementaci logiky pro autentizaci a autorizaci. Můžete je použít k ověření přihlašovacích údajů uživatele, generování JWT tokenů a ochraně citlivých zdrojů.
Příklad: Autentizace uživatele
// pages/api/login.js
import bcrypt from 'bcryptjs';
import jwt from 'jsonwebtoken';
import { query } from '../../lib/db';
export default async function handler(req, res) {
if (req.method === 'POST') {
const { email, password } = req.body;
try {
const results = await query(
'SELECT * FROM users WHERE email = ?',
[email]
);
if (results.length === 0) {
return res.status(401).json({ message: 'Neplatné přihlašovací údaje' });
}
const user = results[0];
const passwordMatch = await bcrypt.compare(password, user.password);
if (!passwordMatch) {
return res.status(401).json({ message: 'Neplatné přihlašovací údaje' });
}
const token = jwt.sign(
{ userId: user.id, email: user.email },
process.env.JWT_SECRET,
{ expiresIn: '1h' }
);
res.status(200).json({ token });
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Interní chyba serveru' });
}
} else {
res.status(405).json({ message: 'Metoda není povolena' });
}
}
Tento příklad autentizuje uživatele porovnáním zadaného hesla s uloženým hashovaným heslem v databázi. Pokud jsou přihlašovací údaje platné, vygeneruje JWT token a vrátí ho klientovi. Klient pak může tento token použít k autentizaci následných požadavků.
3. Zpracování formulářů a odesílání dat
API Routes lze použít ke zpracování odeslaných formulářů a dat zaslaných od klienta. To je užitečné pro vytváření kontaktních formulářů, registračních formulářů a dalších interaktivních prvků.
Příklad: Odeslání kontaktního formuláře
// pages/api/contact.js
import { sendEmail } from '../../lib/email';
export default async function handler(req, res) {
if (req.method === 'POST') {
const { name, email, message } = req.body;
try {
await sendEmail({
to: 'admin@example.com',
subject: 'Nové odeslání kontaktního formuláře',
text: `Jméno: ${name}\nEmail: ${email}\nZpráva: ${message}`,
});
res.status(200).json({ message: 'E-mail úspěšně odeslán' });
} catch (error) {
console.error(error);
res.status(500).json({ message: 'Odeslání e-mailu se nezdařilo' });
}
} else {
res.status(405).json({ message: 'Metoda není povolena' });
}
}
Tento příklad zpracovává odeslání kontaktního formuláře odesláním e-mailu administrátorovi. Používá knihovnu pro odesílání e-mailů (předpokládá se, že je v lib/email
) k odeslání e-mailu. Měli byste nahradit admin@example.com
skutečnou e-mailovou adresou příjemce.
4. Webhooky a zpracování událostí
API Routes lze použít ke zpracování webhooků a reakci na události z externích služeb. To vám umožní integrovat vaši Next.js aplikaci s jinými platformami a automatizovat úkoly.
Příklad: Zpracování Stripe webhooku
// pages/api/stripe-webhook.js
import Stripe from 'stripe';
const stripe = new Stripe(process.env.STRIPE_SECRET_KEY);
export const config = {
api: {
bodyParser: false, // Vypnutí výchozího parsování těla požadavku
},
};
async function buffer(req) {
const chunks = [];
for await (const chunk of req) {
chunks.push(chunk);
}
return Buffer.concat(chunks).toString();
}
export default async function handler(req, res) {
if (req.method === 'POST') {
const sig = req.headers['stripe-signature'];
let event;
try {
const buf = await buffer(req);
event = stripe.webhooks.constructEvent(buf, sig, process.env.STRIPE_WEBHOOK_SECRET);
} catch (err) {
console.log(`Chyba webhooku: ${err.message}`);
res.status(400).send(`Chyba webhooku: ${err.message}`);
return;
}
// Zpracování události
switch (event.type) {
case 'payment_intent.succeeded':
const paymentIntent = event.data.object;
console.log(`PaymentIntent pro ${paymentIntent.amount} byl úspěšný!`);
// Poté definujte a zavolejte metodu pro zpracování úspěšného platebního záměru.
// handlePaymentIntentSucceeded(paymentIntent);
break;
case 'payment_method.attached':
const paymentMethod = event.data.object;
// Poté definujte a zavolejte metodu pro zpracování úspěšného připojení PaymentMethod.
// handlePaymentMethodAttached(paymentMethod);
break;
default:
// Neočekávaný typ události
console.log(`Nezpracovaný typ události ${event.type}.`);
}
// Vraťte odpověď 200 pro potvrzení přijetí události
res.status(200).json({ received: true });
} else {
res.setHeader('Allow', 'POST');
res.status(405).end('Metoda není povolena');
}
}
Tento příklad zpracovává Stripe webhook ověřením podpisu a zpracováním dat události. Vypíná výchozí body parser a používá vlastní funkci buffer pro čtení surového těla požadavku. Je klíčové vypnout výchozí body parser, protože Stripe vyžaduje surové tělo pro ověření podpisu. Nezapomeňte nakonfigurovat váš Stripe webhook endpoint ve vašem Stripe dashboardu a nastavit proměnnou prostředí STRIPE_WEBHOOK_SECRET
.
Osvědčené postupy pro API Routes
Chcete-li zajistit kvalitu a udržovatelnost vašich API Routes, dodržujte tyto osvědčené postupy:
1. Modularizujte svůj kód
Vyhněte se psaní velkých, monolitických API routes. Místo toho rozdělte svůj kód na menší, znovupoužitelné moduly. Tím se váš kód stane srozumitelnějším, testovatelnějším a snadněji udržovatelným.
2. Implementujte zpracování chyb
Správně zpracovávejte chyby ve svých API routes. Používejte bloky try...catch
k zachycení výjimek a vracení vhodných chybových odpovědí klientovi. Logujte chyby, abyste si usnadnili ladění a monitorování.
3. Validujte vstupní data
Vždy validujte vstupní data od klienta, abyste předešli bezpečnostním zranitelnostem a zajistili integritu dat. Používejte validační knihovny jako Joi nebo Yup k definování validačních schémat a vynucení datových omezení.
4. Chraňte citlivá data
Ukládejte citlivá data, jako jsou API klíče a přihlašovací údaje k databázi, do proměnných prostředí. Nikdy nezavazujte citlivá data do svého kódového repozitáře.
5. Implementujte omezování počtu požadavků (Rate Limiting)
Chraňte své API routes před zneužitím implementací omezování počtu požadavků. To omezuje počet požadavků, které může klient provést v daném časovém období. Používejte knihovny pro omezování počtu požadavků jako express-rate-limit
nebo limiter
.
6. Zabezpečte API klíče
Neodhalujte API klíče přímo v kódu na straně klienta. Vždy proxy požadavky přes vaše API routes, abyste ochránili své API klíče před neoprávněným přístupem. Ukládejte API klíče bezpečně do proměnných prostředí na vašem serveru.
7. Používejte proměnné prostředí
Vyhněte se pevnému kódování konfiguračních hodnot ve vašem kódu. Místo toho používejte proměnné prostředí k ukládání konfiguračních nastavení. To usnadňuje správu vaší aplikace v různých prostředích (vývojové, staging, produkční).
8. Logování a monitoring
Implementujte logování a monitoring ke sledování výkonu vašich API routes. Logujte důležité události, jako jsou chyby, varování a úspěšné požadavky. Používejte monitorovací nástroje ke sledování metrik, jako je latence požadavků, chybovost a využití zdrojů. Užitečné mohou být služby jako Sentry, Datadog nebo New Relic.
Aspekty nasazení
Next.js API Routes jsou navrženy pro nasazení na serverless platformách. Mezi populární možnosti nasazení patří:
- Vercel: Vercel je doporučená platforma pro nasazování Next.js aplikací. Poskytuje bezproblémovou integraci s Next.js a automaticky optimalizuje vaši aplikaci pro výkon.
- Netlify: Netlify je další populární serverless platforma, která podporuje nasazení Next.js. Nabízí podobné funkce jako Vercel, jako jsou automatické nasazení a integrace CDN.
- AWS Lambda: AWS Lambda je serverless výpočetní služba, která vám umožňuje spouštět kód bez nutnosti zřizování nebo správy serverů. Můžete nasadit své Next.js API Routes jako Lambda funkce pomocí nástrojů jako Serverless Framework nebo AWS SAM.
- Google Cloud Functions: Google Cloud Functions je serverless spouštěcí prostředí, které vám umožňuje vytvářet a propojovat cloudové služby. Můžete nasadit své Next.js API Routes jako Cloud Functions pomocí nástrojů jako Firebase CLI nebo Google Cloud SDK.
- Azure Functions: Azure Functions je serverless výpočetní služba, která vám umožňuje spouštět kód na vyžádání bez správy infrastruktury. Můžete nasadit své Next.js API Routes jako Azure Functions pomocí nástrojů jako Azure Functions Core Tools nebo Azure CLI.
Při nasazování vaší Next.js aplikace s API Routes se ujistěte, že jsou vaše proměnné prostředí správně nakonfigurovány na platformě pro nasazení. Zvažte také dobu studeného startu serverless funkcí, která může ovlivnit počáteční dobu odezvy vašich API routes. Optimalizace vašeho kódu a používání technik jako provisioned concurrency mohou pomoci zmírnit problémy se studeným startem.
Závěr
Next.js API Routes poskytují výkonný a pohodlný způsob, jak vytvářet full-stack aplikace s Reactem. Využitím serverless funkcí můžete zjednodušit vývoj, snížit provozní náklady a zlepšit výkon aplikace. Dodržováním osvědčených postupů uvedených v tomto článku můžete vytvářet robustní a udržovatelné API Routes, které pohánějí vaše Next.js aplikace.
Ať už vytváříte jednoduchý kontaktní formulář nebo komplexní e-commerce platformu, Next.js API Routes vám mohou pomoci zefektivnit váš vývojový proces a poskytnout výjimečné uživatelské zážitky.